package com.dzt.androidframework.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Random;

/**
 * 图片工具类
 * Created by M02323 on 2017/7/8.
 */

public class JImageKit {

	/**
	 * 压缩图片
	 *
	 * @param cxt
	 * @param filePath 源图片地址
	 * @param width    想要的宽度
	 * @param height   想要的高度
	 * @param isAdjust 是否自动调整尺寸, true图片就不会拉伸，false严格按照你的尺寸压缩
	 * @return
	 */
	public static File getSmallImageFile(Context cxt, String filePath, int width, int height,
										 boolean isAdjust) {

		Bitmap bitmap = reduce(BitmapFactory.decodeFile(filePath), width, height, isAdjust);

		File file = new File(getRandomFileName(cxt.getCacheDir().getPath()));

		BufferedOutputStream outputStream = null;
		try {
			outputStream = new BufferedOutputStream(new FileOutputStream(file));
			bitmap.compress(Bitmap.CompressFormat.JPEG, 60, outputStream);
			outputStream.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (outputStream != null) {
					outputStream.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return file;
	}

	/**
	 * 获取一个随机图片文件名，含路径
	 *
	 * @param filePath
	 * @return
	 */
	public static String getRandomFileName(String filePath) {
		SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss",
				Locale.getDefault());
		Date date = new Date();
		String key = format.format(date);

		Random r = new Random();
		key = key + r.nextInt();
		key = key.substring(0, 15);
		return filePath + "/" + key + ".jpeg";
	}

	/**
	 * 压缩图片
	 *
	 * @param bitmap   源图片
	 * @param width    想要的宽度
	 * @param height   想要的高度
	 * @param isAdjust 是否自动调整尺寸, true图片就不会拉伸，false严格按照你的尺寸压缩
	 * @return
	 */
	public static Bitmap reduce(Bitmap bitmap, int width, int height, boolean isAdjust) {
		// 如果想要的宽度和高度都比源图片小，就不压缩了，直接返回原图
		if (bitmap.getWidth() < width && bitmap.getHeight() < height) {
			return bitmap;
		}
		if (width == 0 && height == 0) {
			width = bitmap.getWidth();
			height = bitmap.getHeight();
		}

		// 根据想要的尺寸精确计算压缩比例, 方法详解：public BigDecimal divide(BigDecimal divisor, int scale, int
		// roundingMode);
		// scale表示要保留的小数位, roundingMode表示如何处理多余的小数位，BigDecimal.ROUND_DOWN表示自动舍弃
		float sx = new BigDecimal(width).divide(new BigDecimal(bitmap.getWidth()), 4, BigDecimal
				.ROUND_DOWN).floatValue();
		float sy = new BigDecimal(height).divide(new BigDecimal(bitmap.getHeight()), 4,
				BigDecimal.ROUND_DOWN).floatValue();
		if (isAdjust) {// 如果想自动调整比例，不至于图片会拉伸
			sx = (sx < sy ? sx : sy);
			sy = sx;// 哪个比例小一点，就用哪个比例
		}
		Matrix matrix = new Matrix();
		matrix.postScale(sx, sy);// 调用api中的方法进行压缩，就大功告成了
		return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix,
				true);
	}
}
